;##################################
;命令：
;nasm -f elf64 day30_1trans_2vshufps_1vblendps.asm -o main.o && gcc main.o -o main -lc -no-pie && ./main
;输出：
;Value in arr[0] is 3.333300.
;Value in arr[1] is 12.222200.
;Value in arr[2] is 13.333300.
;Value in arr[3] is 14.444400.
;##################################
extern printf

section .data
	msg: db `Value in arr[%d] is %f.\n`, 0
	arr: dd 0.0000, 1.1111, 2.2222, 3.3333, 4.4444, 5.5555, 6.6666, 7.7777, 8.8888, 9.9999, 10.0000, 11.1111, 12.2222, 13.3333, 14.4444, 15.5555

section .text
	global main

main:
	push rbp
	mov rbp, rsp

;####################################################################################
	vmovups xmm2, [arr + 4 * 3]
	;a[ 3] a[ 4] a[ 5] a[ 6]
	;a[11] a[12] a[13] a[14]
	;可选0和1两个数，写4次
	;0代表上面一排向量的值，1代表下面一排向量的值
	;比如，我想选择出a[3] a[12] a[13] a[14]
	;0111
	;注意，指令中为逆序
	;1110
	;加上二进制符号b
	;1110b
	;可以转换为十进制14，不是很建议
	vblendps xmm0, xmm2, [arr + 4 * 11], 1110b
	vmovups [arr], xmm0
;####################################################################################

	;打印
	mov ebx, 0
	jmp compare

execute:
	mov rdi, msg
	movsxd rsi, ebx
	cvtss2sd xmm0, dword [arr + 4 * ebx]
	movq rdx, xmm0
	call printf

	inc ebx

compare:
	cmp ebx, 4
	jl execute

	mov eax, 0
	leave
	ret
